// Loesung_von_Aufgabe_6.9_5_Helium_Absorptionsspektrum

float h; // Farbton
float s = 100; // Sättigung
float b; // Helligkeit
float f = 0.1644562; // Faktor

// Wellenlängen des Helium-Spektrums
float L1 = 447.15;
float L2 = 471.32;
float L3 = 492.19;
float L4 = 501.57;
float L5 = 587.57;
float L6 = 667.82;
float L7 = 706.52;

void setup()
{
  size(800, 100);
  background(0);

  // Skala
  stroke(255);
  strokeWeight(3);
  line(2*400-760, 73, 2*400-760, 80);
  line(2*450-760, 73, 2*450-760, 80);
  line(2*500-760, 73, 2*500-760, 80);
  line(2*550-760, 73, 2*550-760, 80);
  line(2*600-760, 73, 2*600-760, 80);
  line(2*650-760, 73, 2*650-760, 80);
  line(2*700-760, 73, 2*700-760, 80);
  line(2*750-760, 73, 2*750-760, 80);

  fill(255);
  textSize(16);
  textAlign(CENTER);
  text("400 nm", 2*400-760, 95);
  text("450 nm", 2*450-760, 95);
  text("500 nm", 2*500-760, 95);
  text("550 nm", 2*550-760, 95);
  text("600 nm", 2*600-760, 95);
  text("650 nm", 2*650-760, 95);
  text("700 nm", 2*700-760, 95);
  text("750 nm", 2*750-760, 95);
}

void draw()
{
  // Farbraum, H-Bereich in Grad, Sättigungsbereich, Helligkeitsbereich
  colorMode(HSB, 360, 100, 100);

  for (float L = 380; L >= 380 && L <= 781; L = L + 0.5)
  {
    stroke(h, s, b); // Hue-Wert, Sättigung, Helligkeit

    if (L >= 380 && L < 420)
    {
      h = 360*(2.0/3.0 + f*(L - 440.0) / (380.0 - 440.0));
      b = 100*(0.3 + 0.7*(L - 380.0) / (420.0 - 380.0));
      line(2*L-760, 70, 2*L-760, 0);
    } else if (L >= 380 && L < 440)
    {
      h = 360*(2.0/3.0 + f*(L - 440.0) / (380.0 - 440.0));
      b = 100;
      line(2*L-760, 70, 2*L-760, 0);
    } else if (L >= 440 && L < 490)
    {
      h = 360*(2.0/3.0 - f*(L - 440.0) / (490.0 - 440.0));
      b = 100;
      line(2*L-760, 70, 2*L-760, 0);
    } else if (L >= 490 &&  L < 510) 
    {
      h = 360*(1.0/3.0 + f*(L - 510.0) / (490.0 - 510.0));
      b = 100;
      line(2*L-760, 70, 2*L-760, 0);
    } else if (L >= 510 && L < 580) 
    {
      h = 360*(1.0/3.0 - f*(L - 510.0) / (580.0 - 510.0));
      b = 100;
      line(2*L-760, 70, 2*L-760, 0);
    } else if (L >= 580 && L < 645) 
    {
      h = 360*(0.0 + f*(L - 645.0) / (580.0 - 645.0));
      b = 100;
      line(2*L-760, 70, 2*L-760, 0);
    } else if (L >= 645 && L < 700) 
    {
      h = 0;
      b = 100;
      line(2*L-760, 70, 2*L-760, 0);
    } else if (L >= 700 && L < 780) 
    {
      h = 0;
      b = 100*(0.3 + 0.7*(L - 780.0) / (700.0 - 780.0));
      line(2*L-760, 70, 2*L-760, 0);
    }
  }

  // Hg-Absorptionslinien
  stroke(0);
  strokeWeight(3);
  line(2*L1-760, 70, 2*L1-760, 0);
  line(2*L2-760, 70, 2*L2-760, 0);
  line(2*L3-760, 70, 2*L3-760, 0);
  line(2*L4-760, 70, 2*L4-760, 0);
  line(2*L5-760, 70, 2*L5-760, 0);
  line(2*L6-760, 70, 2*L6-760, 0);
  line(2*L7-760, 70, 2*L7-760, 0);
}